package com.xunan.demo.service;

import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradeCreateRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePayRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeCreateResponse;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePayResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.xunan.demo.pojo.CommonResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 小程序的参考文档：https://opendocs.alipay.com/mini/introduce/pay
 * 其他的参考文档：https://opendocs.alipay.com/open/00a0ut   开放能力，顺着看
 *
 * API列表中会告诉你整么调用支付功能
 */
@Service
public class AlipayPaymentService {

    /**
     * 小程序回调接口
     */
    @Value("${alipay-payment.alipay-mini-app.notify-url}")
    String ALIPAY_MINI_APP_PAYMENT_NOTIFY_URL;

    /**
     * Web、Wap、App回调接口
     */
    @Value("${alipay-payment.web.notify-url}")
    String WEB_PAYMENT_NOTIFY_URL;

    /**
     * 小程序支付宝请求客户端
     * 使用的是AlipayPaymentConfig中注入的，因没有配置name属性所以spring自动注入同名的
     */
    @Resource
    AlipayClient alipayMiniAppAlipayClient;

    /**
     * Web、Wap、App支付宝请求客户端
     * 使用的是AlipayPaymentConfig中注入的，因没有配置name属性所以spring自动注入同名的
     */
    @Resource
    AlipayClient webAlipayClient;

    public String alipayMiniAppPaymentNotify() {

        return "success";
    }

    public String webPaymentNotify() {

        return "success";
    }

    /**
     * 获取支付宝小程序支付数据
     *
     * @param price   商品价格
     * @param subject 标题
     * @param buyerId 购买用户的UserId
     * @return 支付宝小程序支付数据
     */
    public CommonResult<AlipayTradeCreateResponse> getAlipayMiniAppPayData(Double price, String subject, String buyerId) {

        //判断客户端是否为空
        if (alipayMiniAppAlipayClient == null) {
            return new CommonResult<>(false, "内部错误", null);
        }

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.create.
        AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
        //设置回调接口
        request.setNotifyUrl(ALIPAY_MINI_APP_PAYMENT_NOTIFY_URL);

        //生成订单号
        String outTradeNumber = IdUtil.simpleUUID();

        //组装数据
        JSONObject requestData = new JSONObject();
        //设置订单号
        requestData.put("out_trade_no", outTradeNumber);
        //设置总价
        requestData.put("total_amount", price);
        //设置订单标题
        requestData.put("subject", subject);
        //设置买家支付宝用户ID
        requestData.put("buyer_id", buyerId);

        //SDK已经封装掉了公共参数，这里只需要传入业务参数。
        request.setBizContent(requestData.toString());

        try {
            AlipayTradeCreateResponse response = alipayMiniAppAlipayClient.certificateExecute(request);
            //返回结果
            return new CommonResult<>(true, "成功", response);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return new CommonResult<>(false, "内部错误", null);
        }
    }

    /**
     * 获取电脑网站支付数据
     *
     * @param price   商品价格
     * @param subject 标题
     * @return 支付宝小程序支付数据
     */
    public CommonResult<AlipayTradePagePayResponse> getPagePayData(Double price, String subject) {

        //判断客户端是否为空
        if (webAlipayClient == null) {
            return new CommonResult<>(false, "内部错误", null);
        }

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.create.
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        //设置回调接口
        request.setNotifyUrl(WEB_PAYMENT_NOTIFY_URL);

        //生成订单号
        String outTradeNumber = IdUtil.simpleUUID();

        //组装数据
        JSONObject requestData = new JSONObject();
        //设置订单号
        requestData.put("out_trade_no", outTradeNumber);
        //设置总价
        requestData.put("total_amount", price);
        //设置订单标题
        requestData.put("subject", subject);
        //设置销售产品码
        requestData.put("product_code", "FAST_INSTANT_TRADE_PAY");

        //SDK已经封装掉了公共参数，这里只需要传入业务参数。
        request.setBizContent(requestData.toString());

        try {
            AlipayTradePagePayResponse response = webAlipayClient.certificateExecute(request);
            //返回结果
            return new CommonResult<>(true, "成功", response);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return new CommonResult<>(false, "内部错误", null);
        }
    }

    /**
     * 获取手机网站支付数据
     *
     * @param price   商品价格
     * @param subject 标题
     * @param quitUrl 用户付款中途退出返回商户网站的地址
     * @return 支付宝小程序支付数据
     */
    public CommonResult<AlipayTradeWapPayResponse> getWapPayData(Double price, String subject, String quitUrl) {

        //判断客户端是否为空
        if (webAlipayClient == null) {
            return new CommonResult<>(false, "内部错误", null);
        }

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.create.
        AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
        //设置回调接口
        request.setNotifyUrl(WEB_PAYMENT_NOTIFY_URL);

        //生成订单号
        String outTradeNumber = IdUtil.simpleUUID();

        //组装数据
        JSONObject requestData = new JSONObject();
        //设置订单号
        requestData.put("out_trade_no", outTradeNumber);
        //设置总价
        requestData.put("total_amount", price);
        //设置订单标题
        requestData.put("subject", subject);
        //设置销售产品码
        requestData.put("product_code", "QUICK_WAP_WAY");
        //设置用户付款中途退出返回商户网站的地址
        requestData.put("quit_url", quitUrl);

        //SDK已经封装掉了公共参数，这里只需要传入业务参数。
        request.setBizContent(requestData.toString());

        try {
            AlipayTradeWapPayResponse response = webAlipayClient.certificateExecute(request);
            //返回结果
            return new CommonResult<>(true, "成功", response);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return new CommonResult<>(false, "内部错误", null);
        }
    }

    /**
     * 当面付
     *
     * @param price    商品价格
     * @param subject  标题
     * @param authCode 支付授权码
     * @return 支付宝小程序支付数据
     */
    public CommonResult<AlipayTradePayResponse> codePay(Double price, String subject, String authCode) {

        //判断客户端是否为空
        if (webAlipayClient == null) {
            return new CommonResult<>(false, "内部错误", null);
        }

        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.create.
        AlipayTradePayRequest request = new AlipayTradePayRequest();
        //设置回调接口
        request.setNotifyUrl(WEB_PAYMENT_NOTIFY_URL);

        //生成订单号
        String outTradeNumber = IdUtil.simpleUUID();

        //组装数据
        JSONObject requestData = new JSONObject();
        //设置订单号
        requestData.put("out_trade_no", outTradeNumber);
        //设置总价
        requestData.put("total_amount", price);
        //设置订单标题
        requestData.put("subject", subject);
        //支付场景
        requestData.put("scene", "bar_code");
        //支付授权码
        requestData.put("auth_code", authCode);

        //SDK已经封装掉了公共参数，这里只需要传入业务参数。
        request.setBizContent(requestData.toString());

        try {
            AlipayTradePayResponse response = webAlipayClient.certificateExecute(request);
            //返回结果
            return new CommonResult<>(true, "成功", response);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return new CommonResult<>(false, "内部错误", null);
        }
    }
}
